/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ CarritoServices.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: German Sotelo
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.servicios;

import com.losalpes.catalogo.entities.ItemCarrito;
import com.losalpes.catalogo.entities.Mueble;
import com.losalpes.catalogo.entities.RegistroVenta;
import com.losalpes.catalogo.entities.Usuario;
import com.losalpes.catalogo.excepciones.InvalidOperationException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;

/**
 * implementaciòn de los servicios que se prestan al cliente para administrar su carrito
 * @author German Sotelo
 */
@Stateful
@DeclareRoles({"Administrador", "Gerente"})
public class CarritoServices implements ICarritoServicesLocal,ICarritoServicesRemote {

    /**
     * Unidad de persistencia de la aplicación
     */
    @EJB
    private IPersistenceServices persistenceServices;

    /**
     * Lista de items del carrito
     */
    private ArrayList<ItemCarrito> itemsCarrito = new ArrayList<ItemCarrito>();

    public CarritoServices() {
        
    }

    @RolesAllowed("Administrador")
    public void agregarAlCarrito(String id, int cantidad) {
        Mueble mueble = (Mueble)persistenceServices.findById(Mueble.class,id);
        ItemCarrito ic = new ItemCarrito();
        ic.setMueble(mueble);
        ic.setCantidad(cantidad);
        itemsCarrito.add(ic);
    }

    @RolesAllowed("Administrador")
    public void remove(String id){
        for(int e=0;e<itemsCarrito.size();e++){
            ItemCarrito ic = itemsCarrito.get(e);
            if(ic.getMueble().getReferencia().equals(id)){
                itemsCarrito.remove(e);
                return;
            }
        }
    }

    @RolesAllowed("Administrador")
    public ArrayList<ItemCarrito> getItemsCarrito() {
        return itemsCarrito;
    }

    @Remove
    @RolesAllowed("Administrador")
    public void removeAll() {
        itemsCarrito=new ArrayList<ItemCarrito>();
    }

    @Remove
    @RolesAllowed("Administrador")
    public void pagarCarrito(Usuario user){
        GregorianCalendar gc = new GregorianCalendar();
        System.out.println(gc);
        Date d = gc.getGregorianChange();
        for(ItemCarrito ic:itemsCarrito){
            RegistroVenta registro = new RegistroVenta();
            registro.setCantidad(ic.getCantidad());
            registro.setProducto(ic.getMueble());
            registro.setFechaVenta(d);
            registro.setComprador(user);
            try {
                persistenceServices.create(registro);
            } catch (InvalidOperationException ex) {
            }
            Mueble m = (Mueble)persistenceServices.findById(Mueble.class,ic.getMueble().getReferencia());
            m.setCantidad(m.getCantidad()-ic.getCantidad());
            persistenceServices.update(m);
        }
        itemsCarrito=new ArrayList<ItemCarrito>();
    }
}
